package com.cyru.statemachine.core;

/**
 * description: 状态机
 *
 * @author zhangxuchuan
 * date 2022/5/1
 */
public interface StateMachine<S, E, C> extends Element{

    /**
     * 设置状态机的唯一标识
     */
    void setId(String id);

    /**
     * 获取状态机的唯一标识
     */
    String getId();

    /**
     * 设置状态机的配置信息
     */
    void setConfiguration(StateMachineConfiguration<S, E, C> configuration);

    /**
     * 获取状态机的配置信息
     */
    StateMachineConfiguration<S, E, C> getConfiguration();

    /**
     * 触发一个事件
     * @param source  源状态
     * @param event   事件
     * @param context 上下文
     */
    S fireEvent(S source, E event, C context);

}
